#include "log.h"
#include <pthread.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <sys/time.h>

static char log_buffer[16 * 1024];
static char time_buffer[128];
static pthread_mutex_t log_lock = PTHREAD_MUTEX_INITIALIZER;

// 获取系统时间
void get_formatted_time_with_ms(char* buffer, size_t buffer_size) {
    struct timeval tv;
    gettimeofday(&tv, NULL);    // 获取当前时间（秒和微秒）

    struct tm* tm_info = localtime(&tv.tv_sec);    // 转换为本地时间

    // 使用 strftime 格式化时间（时:分:秒）
    strftime(buffer, buffer_size, "%-m-%-d %H:%M:%S", tm_info);

    // 将微秒部分转换为毫秒
    int milliseconds = tv.tv_usec / 1000;    // 微秒转毫秒

    // 将毫秒部分追加到时间字符串
    snprintf(buffer + strlen(buffer), buffer_size - strlen(buffer), ".%03d", milliseconds);
}

void hexData_printf(uint8_t* data, int len, bool isHex) {
    int offset = 0;
    for (int i = 0; i < len; i++) {
        if (offset > 1024) {
            break;
        }
        if (isHex) {
            offset += sprintf(log_buffer + offset, "%02X ", data[i]);
        } else {
            offset += sprintf(log_buffer + offset, "%d ", data[i]);
        }
    }
    syslog(LOG_INFO, "%s", log_buffer);
#if EnableTerminalLog
    printf("%s\n", log_buffer);
#endif
}

// 终端串口打印 同时写入文件
void terminal_printf(uint8_t level, const char* tag, const char* fmt, ...) {
    pthread_mutex_lock(&log_lock);

    va_list args;
    va_start(args, fmt);

    // 格式化日志内容
    vsnprintf(log_buffer, sizeof(log_buffer), fmt, args);
    get_formatted_time_with_ms(time_buffer, 127);

    syslog(level, "(%s) %s: %s", time_buffer, tag, log_buffer);
#if EnableTerminalLog
    printf("(%s) %s: %s", time_buffer, tag, log_buffer);
#endif
    va_end(args);

    pthread_mutex_unlock(&log_lock);
}
